package Hot100.Medium.GreedyAndDP.DynamicPlanning;

/**
 * 具体可以区分出如下四个状态：
 * 状态一：持有股票状态（今天买入股票，或者是之前就买入了股票然后没有操作，一直持有）
 * 不持有股票状态，这里就有两种卖出股票状态
 * 状态二：保持卖出股票的状态（两天前就卖出了股票，度过一天冷冻期。或者是前一天就是卖出股票状态，一直没操作）
 * 状态三：今天卖出股票
 * 状态四：今天为冷冻期状态，但冷冻期状态不可持续，只有一天！
 */
public class LC309_BuyStockWithIcePeriod {
    public static void main(String[] args) {

    }

    public int maxProfit(int[] prices) {
        if (prices == null || prices.length < 2) {
            return 0;
        }
        // 确定dp数组的含义。dp[i][0] 表示：第 i 天结束时，持有股票的最大利润。
        // dp[i][1] 表示：第 i 天结束时，不持有股票的最大利润。
        int[][] dp = new int[prices.length][2];

        // 初始化dp数组，第0天持股收益为购买股票的钱，不持股收益为0
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        // 第一天的状态，持有股票收益为前一天持有股票的收益，或者今天新买入。不持股收益为延续前一天不持股或者昨天持股今天卖掉
        dp[1][0] = Math.max(dp[0][0], -prices[1]);
        dp[1][1] = Math.max(dp[0][1], dp[0][0] + prices[1]);

        for (int i = 2; i < prices.length; i++) {
            // dp公式，第i天持股，那递推公式就是要么保持前一天的持股状态继续持股，要么就是今天买入股票，然而买股票之前一天是冷静期，因此需要用两天前的不持股的钱减去今天的股价
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i]);
            // 第i天不持股的状态，要么是延续前一天不持股的状态，要么是今天给股票卖了，那就是前一天的持股状态下的钱，加上今天的股价就是最终的利润。
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        return dp[prices.length - 1][1];
    }
}
